package com.zzh.project.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zzh.project.annotation.AuthCheck;
import com.zzh.project.common.BaseResponse;
import com.zzh.project.common.ErrorCode;
import com.zzh.project.common.ResultUtils;
import com.zzh.project.exception.BusinessException;
import com.zzh.project.mapper.UserInterfaceInfoMapper;
import com.zzh.project.model.vo.InterfaceInfoVO;
import com.zzh.project.service.InterfaceInfoService;
import com.zzh.hapicommon.model.entity.InterfaceInfo;
import com.zzh.hapicommon.model.entity.UserInterfaceInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 分析控制器
 *
 * @author 张志豪
 * @version 1.0
 */
//将该类标记为 RESTful 控制器，表明它会返回 JSON 格式的数据而不是视图页面。
@RestController
//将所有以 /analysis 为前缀的 HTTP 请求映射到此控制器。
@RequestMapping("/analysis")
//用于启用 日志记录（log 对象）功能，方便打印日志
@Slf4j
public class AnalysisController {
    //注入用于与 用户接口信息表 交互的 Mapper。
    @Resource
    private UserInterfaceInfoMapper userInterfaceInfoMapper;
    //注入服务层对象，用于处理 接口信息 的业务逻辑。
    @Resource
    private InterfaceInfoService interfaceInfoService;

    @GetMapping("/top/interface/invoke")
    @AuthCheck(mustRole = "admin")
    public BaseResponse<List<InterfaceInfoVO>> listTopInvokeInterfaceInfo() {
        //查询调用次数最多的接口信息
        //通过调用 listTopInvokeInterfaceInfo(3) 方法，查询调用次数最多的 前3个接口。
        List<UserInterfaceInfo> userInterfaceInfoList =  userInterfaceInfoMapper.listTopInvokeInterfaceInfo(3);
        //按照接口ID进行分组
        //使用 Java Stream API 按照 interfaceInfoId 进行分组，
        //生成一个 Map，键为 接口ID，值为该接口ID对应的 UserInterfaceInfo 列表。
        Map<Long, List<UserInterfaceInfo>> interfaceInfoIdObjMap = userInterfaceInfoList.stream()
                .collect(Collectors.groupingBy(UserInterfaceInfo::getInterfaceInfoId));
        //访问数据库进行接口查询，将查询的接口放入list
        QueryWrapper<InterfaceInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", interfaceInfoIdObjMap.keySet());
        List<InterfaceInfo> list = interfaceInfoService.list(queryWrapper);
        if (CollectionUtils.isEmpty(list)) { //校验接口是否为空，空则抛出系统异常
            throw new BusinessException(ErrorCode.SYSTEM_ERROR);
        }
        //转换数据为VO对象(视图对象)
        //使用 Stream API 将 InterfaceInfo 对象转换为 InterfaceInfoVO 对象。
        List<InterfaceInfoVO> interfaceInfoVOList = list.stream().map(interfaceInfo -> {
            InterfaceInfoVO interfaceInfoVO = new InterfaceInfoVO();
            //进行对象属性的拷贝
            BeanUtils.copyProperties(interfaceInfo,interfaceInfoVO);
            //从分组的 Map 中提取每个接口的 调用总次数 并赋值给 InterfaceInfoVO。
            int totalNum = interfaceInfoIdObjMap.get(interfaceInfo.getId()).get(0).getTotalNum();
            interfaceInfoVO.setTotalNum(totalNum);
            return interfaceInfoVO;
        }).collect(Collectors.toList());
        //返回成功响应
        return ResultUtils.success(interfaceInfoVOList);
    }
}
